package com.config.tomcat;

import com.config.ServletContextInitializerTest;
import com.config.tomcat.lifecycle.ContextLifecycleListener;
import com.config.tomcat.lifecycle.ContextContainerListener;
import com.config.tomcat.lifecycle.HostLifecycleListener;
import com.config.tomcat.value.ContextValueTest;
import com.config.tomcat.value.HostValueTest;
import org.apache.catalina.Context;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.stereotype.Component;

/**
 * @author chengyadong
 * @date 2023/9/19 15:02
 * @description 对内置tomcat中的context组件进行自定义扩展
 * 经过扫描当前类对应的bd会注入到bdMap中  在自动配置类ServletWebServerFactoryConfiguration中存在一个@Bean方法生成一个TomcatServletWebServerFactory对象，会通过
 * 参数注入的方式将当前bean对象引入到方法中从而封装到webServiceFactory对象属性中，在之后的tomcat初始化过程中会调用其customize方法
 * 注意：其和WebServerFactoryCustomizer类似，但是执行时机不一样，当前类会通过@bean方法生成bd时通过参数注入的形式先加载到工厂属性中，
 * 所以在WebServerFactoryCustomizer可以获取到该对象信息 而且WebServerFactoryCustomizer功能更大
 */
@Component
public class TomcatContextCustomizerTest implements TomcatContextCustomizer {
	@Override
	public void customize(Context context) {
		//给context添加一个value
		context.getPipeline().addValve(new ContextValueTest());
		//给host组件添加value
		context.getParent().getPipeline().addValve(new HostValueTest());
		//给context增加一个LifecycleListener监听器
		context.addLifecycleListener(new ContextLifecycleListener());
		//给host增加一个LifecycleListener监听器（生命周期）
		context.getParent().addLifecycleListener(new HostLifecycleListener());
		//给context组件添加一个containerListener监听器（事件）
		context.addContainerListener(new ContextContainerListener());
		//给context增加一个ServletContextInitializer(第二个参数为Set<Class<?>> c的值，相当于@handlesTypes注解，需要手动设置该set集合)
		context.addServletContainerInitializer(new ServletContextInitializerTest(),null);
		System.out.println("应用路径：="+context.getPath());
	}
}
